package crawler_twitter;


import java.util.LinkedList;
import java.util.List;

import mysql.Connector;
import mysql.DBCache;

import access_twitter.TwitterFactory;
import access_twitter.TwitterWrapper;
import access_twitter.searchItem;


import winterwell.jtwitter.Twitter.Status;
import winterwell.jtwitter.Twitter.User;

/*classe responsabile del crawling degli utenti a partire dagli utenti che contengono nei tweet l'item cercato
*/
public class CrawlerUtentiByItem {
	TwitterWrapper twitter;
	Status status;
	DBCache dbCache;
	List<Status> itemList = new LinkedList<Status>();
	static List<String> searchList = new LinkedList<String>();
	
	public static List<String> getListItem(){
		searchList.add("android");
		searchList.add("apple");
		searchList.add("wp7");
		return searchList;
	}
		

	
	public  CrawlerUtentiByItem(Status st) {
		twitter = TwitterFactory.getInstance().getTwitterWrapper();
		this.status = st;
		dbCache = DBCache.getInstance();
	}
	

	private void run(String str) {
		//avvio la connessione al db, il programma usa una sola connessione al db mysql
		Connector.getInstance().connetti();
		User rootUser;	
		String utente = status.getUser().toString();
		rootUser = status.getUser();		
		
		if (rootUser != null){
			System.out.println("Inizio scansione utenti");
			//crawlBreadthFirst(rootUser);
			crawluser(rootUser,str);
		}else
			System.out.println("Impossibile scaricare la timeline di " + utente );
		
		//chiudo la connessione al db
		Connector.getInstance().disconnetti();

	}
	
	private void crawluser(User user, String str) {
		dbCache.processaTimeline(status,user,str);
	}

	//visita in ampiezza a pertire dall'utente radice
	/*private void crawlBreadthFirst(User rootUser) {
		LinkedList<User> queue = new LinkedList<User>();
		queue.add(rootUser);
		
		int cont = 0;
		User user;
		int profonditaVisitata = 0;
		int ampiezzaProssimoLivello = 0;
		int maxProfondita=1;
		int utentiVisitati = 0;
		int ampiezzaLivelloAttuale = 1;
		
		
		List<User> amiciFiltrati;

		//ciclo che scorre l'albero delle amicizie in ampiezza
		//ad ogni livello calcola in modo incrementale il numero di amici presenti nel livello successivo
		//al fine di riconoscere la profondita raggiunta e fermarsi quando si raggiunge la profondita massima
		while (!queue.isEmpty() && profonditaVisitata < maxProfondita) {
			user = queue.remove();
			//PROCESSO LA TIMELINE DELL'UTENTE ATTUALE
			dbCache.processaTimeline(status,user);
			
			//AGGIUNGO IN CODA GLI AMICI DELL'UTENTE
			amiciFiltrati = dbCache.getAmici_2(twitter, user);
			ampiezzaProssimoLivello += amiciFiltrati.size();

			
			//controllo la profondita raggiunta
			utentiVisitati++;
			if(utentiVisitati == ampiezzaLivelloAttuale){	
				profonditaVisitata++;
				ampiezzaLivelloAttuale = ampiezzaProssimoLivello;
				ampiezzaProssimoLivello = 0;
				utentiVisitati = 0;
			}
			
			//aggiungo in coda gli utenti da processare
			for (User friend : amiciFiltrati) {
				queue.add(friend);
				cont ++;
			}
			cont = 0;
		}
	}*/


	public static void main(String[] args) {
		//Lista di parole da cercare
		searchList= getListItem();
		int cont;
		//avvio il crawling per ogni item
		for(String str : searchList){
		List<Status> listaUtentiByItem = searchItem.getListsearch(str);
		cont = 0;
		//avvio il crawling per ogni utente
		for(Status st : listaUtentiByItem){
			if(cont<100){CrawlerUtentiByItem tc = new CrawlerUtentiByItem(st);
			tc.run(str);
			cont++;
			}
			
			}
		}
	}

}
